/* Test case by Yoshito Kawada <KAWADA@jp.ibm.com>.  */
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>


void error(int exitCode, int, const char* message);


int
main(int argc, char *argv[])
{
	int a = 3;
	int fd;
	char name[] = "/tmp/wprintf.out.XXXXXX";
	FILE *fp;
	char buf[100];
	size_t len;
	int res = 0;

	fd = mkstemp(name);
	if (fd == -1)
		error(EXIT_FAILURE, errno, "cannot open temporary file");

	unlink(name);

	setlocale(LC_ALL, "");

	fp = fdopen(dup(fd), "w");
	if (fp == NULL)
		error(EXIT_FAILURE, errno, "fdopen(,\"w\")");

	fwprintf(fp,L"test start" );
	fwprintf(fp, L" int %d\n", a);

	/* String with precision.  */
	fwprintf(fp, L"1[%6.3s]\n", argv[1]);

	fclose(fp);

	fp = fdopen(dup (fd), "a");
	if (fp == NULL)
		error(EXIT_FAILURE, errno, "fdopen(,\"a\")");

	setvbuf(fp, NULL, _IONBF, 0);

	/* fwprintf to unbuffered stream.   */
	fwprintf(fp, L"hello.\n");

	fclose(fp);

	/* Now read it back in.  This time using multibyte functions.  */
	lseek(fd, SEEK_SET, 0);
	fp = fdopen(fd, "r");
	if (fp == NULL)
		error(EXIT_FAILURE, errno, "fdopen(,\"r\")");

	if (fgets(buf, sizeof buf, fp) != buf)
		error(EXIT_FAILURE, errno, "first fgets");
	len = strlen(buf);
	if (buf[len - 1] == '\n')
		--len;
	else {
		puts ("newline missing after first line");
		res = 1;
	}
	printf("1st line: \"%.*s\" -> %s\n", (int) len, buf,
		strncmp(buf, "test start int 3", len) == 0 ? "OK" : "FAIL");
	res |= strncmp(buf, "test start int 3", len) != 0;

	if (fgets(buf, sizeof(buf), fp) != buf)
		error(EXIT_FAILURE, errno, "second fgets");
	len = strlen(buf);
	if (buf[len - 1] == '\n')
		--len;
	else {
		puts("newline missing after second line");
		res = 1;
	}
	printf ("2nd line: \"%.*s\" -> %s\n", (int) len, buf,
		strncmp(buf, "1[   Som]", len) == 0 ? "OK" : "FAIL");
	res |= strncmp(buf, "1[   Som]", len) != 0;

	if (fgets(buf, sizeof(buf), fp) != buf)
		error(EXIT_FAILURE, errno, "third fgets");
	len = strlen(buf);
	if (buf[len - 1] == '\n')
		--len;
	else {
		puts("newline missing after third line");
		res = 1;
	}
	printf("3rd line: \"%.*s\" -> %s\n", (int) len, buf,
		strncmp(buf, "hello.", len) == 0 ? "OK" : "FAIL");
	res |= strncmp(buf, "hello.", len) != 0;

	return res;
}


void
error(int exitCode, int errorCode, const char* message)
{
	perror(message);
	exit(exitCode);
}
